package cn.micai.base.thread;

import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 描述：并发类容器之Queue
 * <p>
 *
 * @author: 赵新国
 * @date: 2018/2/22 16:23
 */
public class UseQueue {

    /**
     *
     * ConcurrentLinkedQueue：是一个适用于高并发场景下的队列，通过无锁的方式，实现了高并发状态下的高性能，通常ConcurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的，尾是最近加入的，该队列不允许null元素。
     ConcurrentLinkedQueue重要方法：
     add()和offer()都是加入元素的方法（在ConcurrentLinkedQueue中，这两个方法没有任何区别，大家可能有疑问，既然两个没有区别为何还要弄两个方法，这是因为这两个方法都继承自父类Queue，在其它场景下是可能不一样的）
     poll()和peek()都是取头元素节点，区别在于前者会删除元素，后者不会。
     下面我们来看个例子，如下所示。这是最常用的几个方法。
     * @param args
     */
    public static void main(String [] args) {
        // 高性能无阻塞无界队列：ConcurrentLinkedQueue
        ConcurrentLinkedQueue<String> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();

        concurrentLinkedQueue.offer("a");
        concurrentLinkedQueue.add("b");
        concurrentLinkedQueue.offer("c");
        concurrentLinkedQueue.add("d");

        System.out.println(concurrentLinkedQueue.poll());// 取出第一个元素并删除
        System.out.println(concurrentLinkedQueue.size());// 打印队列的大小
        System.out.println(concurrentLinkedQueue.peek());// 取出第一个元素，不删除
        System.out.println(concurrentLinkedQueue.size());// 打印队列的大小
        System.out.println("--------------------");

        for (Iterator iterator = concurrentLinkedQueue.iterator(); iterator.hasNext();) {
            String str = (String) iterator.next();
            System.out.println(str);
        }


    }
}
